<script setup lang="ts">
import { onLaunch } from '@dcloudio/uni-app';
import { refreshAppToken } from '@/api/login';
import { getAppVersion } from '@/api/common';
import { setStorage, getStorage } from '@/assets/js/utils';
import { config } from '@/assets/js/config';
// #ifdef H5
import { setSession } from '@/assets/js/utils';
// #endif

onLaunch(async (option: any) => {
    // #ifndef APP
    refreshToken();
    appCheckForUpdate();
    // #endif

    // #ifdef MP-WEIXIN
    uni.setInnerAudioOption({
        obeyMuteSwitch: false
    });
    checkForUpdate();
    // #endif

    // #ifdef H5
    //首次进入应用缓存，用于全局拦截判断是否首次进入应用
    setSession('first_launch', '1');
    //保存着陆页面地址，解决ios进入内页无法初始化微信sdk的问题
    setSession('landing_url', location.href);
    // #endif
});

//刷新token
const refreshToken = async () => {
    let [result, err] = await refreshAppToken();
    if(result) {
        setStorage('token', result);
    }
}

//app检测更新
const appCheckForUpdate = async () => {
    let data = {
        platform: config.platform,
        modelType: config.targetLang,
        appVersion: config.appVersion
    }
    let [result, err] = await getAppVersion(data);
    let modalOption: any = {
        title: "版本更新",
        content: 'APP有新版本发布，点击 立即更新 进行最新版本下载。',
        confirmText: '立即更新',
        cancelText: '取消',
    }
    if(result && result.url) {
        let compareVerResult = compareVersions(config.appVersion, result.appVersion);
        //本地版本比最新版本低
        if(compareVerResult == -1) {
            let alertAppVersion = getStorage('alertAppVersion');
            //判断之前没有点击取消下载本版本的记录
            if(!alertAppVersion || alertAppVersion != result.appVersion) {
                //判断是否需要强制更新
                if(result.mandatory == 1) {
                    modalOption.showCancel = false
                }else{
                    modalOption.showCancel = true
                }
                uni.showModal({
                    ...modalOption,
                    success: function (res: any) {
                        if (res.confirm) {
                            console.log('用户点击确定');
                            uni.showLoading({
                                title: '正在下载,请稍后'
                            })
                            uni.downloadFile({
                                // 存放最新安装包的地址
                                url: result.url,
                                success: (downloadResult) => {
                                    uni.hideLoading();
                                    if (downloadResult.statusCode ===200) {
                                        uni.hideLoading();
                                        plus.runtime.install(
                                            downloadResult.tempFilePath, {
                                                force: false
                                            },
                                            function() {
                                                console.log('install success...');
                                                plus.runtime.restart();
                                            },
                                            function(e) {
                                                uni.hideLoading();
                                                console.error('install fail...');
                                            }
                                        );
                                    }
                                }
                            });
                        } else if (res.cancel) {
                            setStorage('alertAppVersion', result.appVersion);
                            console.log('用户点击取消');
                        }
                    }
                });
            }
            console.log('有新版本需要更新');
        }
        console.log(compareVerResult);
    }
}

//比对版本号
const compareVersions = (currentVersion: any, lastVersion: any) => {
    // 将版本号按点分割成数组
    const v1Parts = currentVersion.split('.').map(Number);
    const v2Parts = lastVersion.split('.').map(Number);
    
    // 获取最大长度
    const maxLength = Math.max(v1Parts.length, v2Parts.length);
    
    // 补全较短的数组，用0填充
    while (v1Parts.length < maxLength) v1Parts.push(0);
    while (v2Parts.length < maxLength) v2Parts.push(0);
    
    // 逐位比较
    for (let i = 0; i < maxLength; i++) {
        if (v1Parts[i] > v2Parts[i]) {
            //当前版本大于最后版本
            return 1;
        } else if (v1Parts[i] < v2Parts[i]) {
            // 当前版本小于最后版本
            return -1;
        }
    }
    
    // 所有位都相等
    return 0;
}

// 检测是否更新
const checkForUpdate = () => {
    const _this = this;
    // 检查小程序是否有新版本发布
    const updateManager = uni.getUpdateManager();
    // 请求完新版本信息的回调
    updateManager.onCheckForUpdate(res => {
        //检测到新版本，需要更新，给出提示
        if (res && res.hasUpdate) {
            uni.showModal({
                title: '更新提示',
                content: '检测到新版本，是否下载新版本并重启小程序？',
                success(res) {
                    if (res.confirm) {
                        //用户确定下载更新小程序，小程序下载及更新静默进行
                        downLoadAndUpdate(updateManager);
                    } else {
                        // 若用户点击了取消按钮，二次弹窗，强制更新，如果用户选择取消后不需要进行任何操作，则以下内容可忽略
                        uni.showModal({
                            title: '温馨提示~',
                            content: '本次版本更新涉及到新的功能添加，旧版本无法正常访问的哦~',
                            confirmText: '确定更新',
                            cancelText: '取消更新',
                            success(res) {
                                if (res.confirm) {
                                    //下载新版本，并重新应用
                                    downLoadAndUpdate(updateManager);
                                }
                            }
                        });
                    }
                }
            });
        }
    });
};

// 下载小程序新版本并重启应用
const downLoadAndUpdate = (updateManager: any) => {
    const _this = this;
    uni.showLoading({ title: '小程序更新中' });
    // //静默下载更新小程序新版本
    updateManager.onUpdateReady((res: any) => {
        uni.hideLoading();
        //新的版本已经下载好，调用 applyUpdate 应用新版本并重启
        updateManager.applyUpdate();
    });
    // 更新失败
    updateManager.onUpdateFailed((res: any) => {
        // 新的版本下载失败
        uni.hideLoading();
        uni.showModal({
            title: '已经有新版本了哟~',
            content: '新版本已经上线啦~，请您删除当前小程序，重新搜索打开哟~',
            showCancel: false
        });
    });
};
</script>
<style></style>
